/**
 * 
 */
package com.ssm.util;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.swing.ListModel;

import org.apache.commons.fileupload.FileUpload;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import com.alibaba.druid.wall.Violation;
import com.ssm.exception.WebException;
import com.ssm.util.Interface.PageStyle;

/**
 * SSM工具类 
 * @author 危文涛<245108903@qq.com>
 * @version 2016年1月31日 下午1:50:57
 *
 */
public class SSMUtil {

	
	/**
	 * 表格分页工具(默认样式)
	 * @author 危文涛<245108903@qq.com>
	 * @version 2016年1月31日 下午2:00:02
	 *
	 * @param address 页面地址
	 * @param limit  每页显示数目
	 * @param total   数据条数
	 * @param pagenum 当前显示页
	 * @return 分页html代码
	 */
	public static String tablePageToHtml(String address,int limit,int total,int prenum)
	{
		int pageAllNum=(total%limit)>0?(total/limit)+1:(total/limit);
		PageStyle dps=new DefaultPageStyle();
		String html;
		if(pageAllNum<1)
			html="";
		else
			html=dps.CreateHtml(pageAllNum, prenum, address);
		return html;
	}
	
	

	/**
	 * 表格分页工具(自定义样式)
	 * @author 危文涛<245108903@qq.com>
	 * @version 2016年1月31日 下午2:00:02
	 *
	 * @param address 页面地址
	 * @param offset  每页显示数目
	 * @param total   数据条数
	 * @param pagenum 当前显示页
	 * @param style 实现PageStyle接口
	 * @return 分页html代码
	 */
	public static String tablePageToHtml(String address,int offset,int total,int prenum,PageStyle style)
	{
		int pageAllNum=(total/offset-total)>0?(total/offset)+1:(total/offset);
		String html;
		if(pageAllNum==0)
			html="";
		else
			html=style.CreateHtml(pageAllNum, prenum, address);
		return html;
	}
	
	
	/**
	 * 请求中参数装载到javaBean
	 * @author 危文涛<245108903@qq.com>
	 * @version 2016年2月1日 下午8:04:02
	 *
	 * @param classtype javaBean
	 * @param request 请求对象
	 * @return javaBean对象
	 */
	public static <T> T LoadToBean(Class<T> classtype,HttpServletRequest request)
	{
		 try {
			T clazz= classtype.newInstance();
			
			for(Method method : classtype.getMethods())
			{
				if(method.getName().substring(0, 3).equals("set"))
				{
					String strmethod=method.getName().substring(3);
					strmethod=strmethod.toLowerCase();
					Object value=request.getParameter(strmethod);
					if(value==null)
						value=request.getAttribute(strmethod);
					if(value instanceof String&&String.valueOf(value).equals(""))
						value=null;
					if(value!=null)
					{
						if(method.getParameterTypes()[0].getName()==Integer.class.getName())
							value=Integer.parseInt((String) value);
						method.invoke(clazz,value);
					}
				}
			}
			
			return clazz;
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			new WebException("对象初始化失败");
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			new WebException("方法没权限访问");
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			new WebException("方法参数错误");
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			new WebException("异常没有被捕获");
		}
		 return null;
		 
	}
	
	
	public static <BT> List<BT> List2Tree(List<BT> list,String titleFieldName,Integer root)
	{
		if(titleFieldName==null)
			titleFieldName="title";
		if(root==null)
			root=1;
		List<BT> newList=new ArrayList<BT>();
		titleFieldName=titleFieldName.substring(0,1).toUpperCase()+titleFieldName.substring(1).toLowerCase();
		list2TreeList(list, newList,titleFieldName, 1,0);
		return newList;
	}
	
	private static <BT> void list2TreeList(List<BT> list,List<BT>newList,String titleFieldName,Integer root,Integer level)
	{
		try {
			List<BT> tempList=new ArrayList<BT>();
		for(BT obj:list)
		{
			Method method= obj.getClass().getMethod("getPid",null);
			int pid=(Integer)method.invoke(obj,null);
			if(pid==root)
			{
				tempList.add(obj);
			}
		}
		if(tempList.size()!=0)
		{
			for(BT obj: tempList)
			{
				Method method=obj.getClass().getMethod("getTitle",null);
				String title=(String) method.invoke(obj,null);
				String str="";
				for(int i=0;i<level;i++)
					str+="&nbsp";
				str+="L"+title;
				method=obj.getClass().getMethod("setTitle",String.class);
				method.invoke(obj,str);
				method= obj.getClass().getMethod("getId",null);
				int id=(Integer)method.invoke(obj,null);
				newList.add(obj);
				list2TreeList(list,newList,titleFieldName,id,level+1);
			}
		}
		
		} catch (NoSuchMethodException | SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
